﻿using System;
using System.Windows.Forms;
using App.Modelo.Interfaces;
using App.Persistencia;
using App.Seguridad.Vista.Comandos;
using App.Seguridad.Vista.Forms;
using App.Seguridad.Vista.Menu;
using App.Modelo;
using System.Configuration;

namespace App.Seguridad.Vista
{
    public class ModuloSeguridad : ContenedorModulo
    {
        private Usuario _UsuarioActual;
        private PerfilCommandInvoker _PerfilInvoker;

        internal readonly FabricaControladoras FabricaControladoras
            = new FabricaControladoras();


        #region <<singleton>> ModuloSeguridad

        private static volatile ModuloSeguridad _instance = null;

        private static readonly object padlock = new object();

        public static ModuloSeguridad Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (padlock)
                    {
                        if (_instance == null)
                            _instance = new ModuloSeguridad();
                    }
                }
                return _instance;
            }
        }

        #endregion

        public ISessionActual SessionActual { get; set; }


        public override void Init(IModuloPrincipal principal)
        {
            ModuloPrincipal = principal;

            var comandos = principal.CatalogoComandos;
            var fachada = new SeguridadFachada();
       
            comandos.Add("Usuarios/alta", new Comando(fachada.AltaUsuario));
            comandos.Add("Usuarios/baja", new Comando(fachada.BajaUsuario));
            comandos.Add("Usuarios/modificar", new Comando(fachada.ModificarUsuarios));
            comandos.Add("Usuarios/ver", new Comando(fachada.VerUsuarios));
            comandos.Add("Grupos/alta", new Comando(fachada.AltaGrupo));
            comandos.Add("Grupos/baja", new Comando(fachada.BajaGrupo));
            comandos.Add("Grupos/modificar", new Comando(fachada.ModificarGrupos));
            comandos.Add("Grupos/ver", new Comando(fachada.VerGrupos));
            comandos.Add("ClaveAcceso/modificar", new Comando(fachada.ModificarClaveAcceso));
            comandos.Add("Application/logout", new Comando(fachada.CerrarSession));
            comandos.Add("Application/salir", new Comando(fachada.Salir));
            
        }

        public PerfilCommandInvoker PerfilInvoker
        {
            get
            {
                if (_PerfilInvoker == null)
                    _PerfilInvoker = new PerfilCommandInvoker();
                return _PerfilInvoker;
            }
        }


        public FormularioPrincipal MdiParent { get; set; }

        
        /**
         * el usuario actual de la session
         */
        public Usuario UsuarioActual
        {
            get
            {
                if (null != SessionActual)
                    return (Usuario) SessionActual.UsuarioActual;
                return _UsuarioActual;
            }
        }
       
    }
}
